package io.bd;

import io.Carpeta;
import io.Cliente;
import java.io.BufferedReader;
import java.io.IOException;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 *
 * @author Mariano Zapata
 */
public class ABMRCliente {
    
    private Connection conexion;
    
    public ABMRCliente(Connection conexion) {this.conexion= conexion;}
    
    public void recuperar(Carpeta padre) throws SQLException
    {
        String renglon= "SELECT id, apellido, nombre FROM Cliente WHERE carpeta= " + padre.obtenerId() +
                " ORDER BY apellido, nombre";
        List<Cliente> hijos= new ArrayList<Cliente>();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= padre.obtenerCopiaRuta();
            ruta.add(r.getLong(1));
            Cliente c= new Cliente(ruta);
            c.setApellido(r.getString(2));
            c.setNombres(r.getString(3));
            hijos.add(c);
        }
        r.close();
        consulta.close();
        padre.setHijosCliente(hijos);
    }
    
    public void cargar(Cliente c) throws SQLException, IOException
    {
        String renglon= "SELECT * FROM Cliente WHERE id= " + c.obtenerId();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        r.next();
        c.setApellido(r.getString(3));
        c.setNombres(r.getString(4));
        c.setDni(r.getInt(5));
        c.setFechaNacimiento(this.transformarFecha(r.getDate(6)));
        c.setEstadoCivil(r.getByte(7));
        c.setTelMovil(r.getString(8));
        c.setEmail(r.getString(9));
        c.setDomicilioDireccion(r.getString(10));
        c.setDomicilioCiudad(r.getString(11));
        c.setDomicilioProvincia(r.getString(12));
        c.setDomicilioCodigoPostal(r.getInt(13));
        c.setDomicilioTelFijo(r.getString(14));
        c.setTrabajoNombre(r.getString(15));
        c.setTrabajoPuesto(r.getString(16));
        c.setTrabajoDireccion(r.getString(17));
        c.setTrabajoCiudad(r.getString(18));
        c.setTrabajoProvincia(r.getString(19));
        c.setTrabajoCodigoPostal(r.getInt(20));
        c.setTrabajoTelFijo(r.getString(21));
        c.setTrabajoTelFax(r.getString(22));
        c.setTrabajoWeb(r.getString(23));
        c.setSeguimiento(this.transformarClob(r.getClob(24)));
        r.close();
        consulta.close();
    }
    
    public Cliente crear(Cliente c, Carpeta padre) throws SQLException
    {
        String renglon= "INSERT INTO Cliente (carpeta, apellido, nombre) VALUES (?, ?, ?)";
        List<Long> ruta= padre.obtenerCopiaRuta();
        PreparedStatement consulta= conexion.prepareStatement(renglon, PreparedStatement.RETURN_GENERATED_KEYS);
        consulta.setLong(1, padre.obtenerId());
        consulta.setString(2, c.getApellido());
        consulta.setString(3, c.getNombres());
        consulta.executeUpdate();
        ResultSet r= consulta.getGeneratedKeys();
        r.next();
        ruta.add(r.getLong(1));
        r.close();
        consulta.close();
        Cliente ret= new Cliente(ruta);
        ret.setApellido(c.getApellido());
        ret.setNombres(c.getNombres());
        return ret;
    }
    
    public void guardar(Cliente c) throws SQLException
    {
        String renglon= "UPDATE Cliente SET apellido= ?, nombre= ?, dni= ?, fecha_nacimiento= ?, estado_civil= ?, " +
                "tel_movil= ?, email= ?, domicilio_direccion= ?, domicilio_ciudad= ?, domicilio_provincia= ?, " +
                "domicilio_codigo_postal= ?, domicilio_tel_fijo= ?, trabajo_nombre= ?, trabajo_puesto= ?, " +
                "trabajo_direccion= ?, trabajo_ciudad= ?, trabajo_provincia= ?, trabajo_codigo_postal= ?, " +
                "trabajo_tel_fijo= ?, trabajo_tel_fax= ?, trabajo_web= ?, seguimiento= ? WHERE id= ?";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setString(1, c.getApellido());
        consulta.setString(2, c.getNombres());
        consulta.setInt(3, c.getDni());
        consulta.setDate(4, this.transformarFecha(c.getFechaNacimiento()));
        consulta.setByte(5, c.getEstadoCivil());
        consulta.setString(6, c.getTelMovil());
        consulta.setString(7, c.getEmail());
        consulta.setString(8, c.getDomicilioDireccion());
        consulta.setString(9, c.getDomicilioCiudad());
        consulta.setString(10, c.getDomicilioProvincia());
        consulta.setInt(11, c.getDomicilioCodigoPostal());
        consulta.setString(12, c.getDomicilioTelFijo());
        consulta.setString(13, c.getTrabajoNombre());
        consulta.setString(14, c.getTrabajoPuesto());
        consulta.setString(15, c.getTrabajoDireccion());
        consulta.setString(16, c.getTrabajoCiudad());
        consulta.setString(17, c.getTrabajoProvincia());
        consulta.setInt(18, c.getTrabajoCodigoPostal());
        consulta.setString(19, c.getTrabajoTelFijo());
        consulta.setString(20, c.getTrabajoTelFax());
        consulta.setString(21, c.getTrabajoWeb());
        consulta.setString(22, c.getSeguimiento());
        consulta.setLong(23, c.obtenerId());
        consulta.executeUpdate();
        consulta.close();
    }
    
    public void eliminar(Cliente c) throws SQLException
    {
        String renglon= "DELETE FROM Cliente WHERE id= " + c.obtenerId();
        Statement consulta= conexion.createStatement();
        consulta.executeUpdate(renglon);
        consulta.close();
    }
    
    public void cortar(Cliente c, Carpeta nuevoPadre) throws SQLException
    {
        String renglon= "UPDATE Cliente SET carpeta= " + nuevoPadre.obtenerId() + " WHERE id= " + c.obtenerId();
        Statement consulta= conexion.createStatement();
        consulta.executeUpdate(renglon);
        consulta.close();
    }
    
    public void copiar(Cliente c, Carpeta nuevoPadre) throws SQLException, IOException
    {
        Cliente copia= this.crear(c, nuevoPadre);
        this.cargar(c);
        copia.setDni(c.getDni());
        copia.setFechaNacimiento(c.getFechaNacimiento());
        copia.setEstadoCivil(c.getEstadoCivil());
        copia.setTelMovil(c.getTelMovil());
        copia.setEmail(c.getEmail());
        copia.setDomicilioDireccion(c.getDomicilioDireccion());
        copia.setDomicilioCiudad(c.getDomicilioCiudad());
        copia.setDomicilioProvincia(c.getDomicilioProvincia());
        copia.setDomicilioCodigoPostal(c.getDomicilioCodigoPostal());
        copia.setDomicilioTelFijo(c.getDomicilioTelFijo());
        copia.setTrabajoNombre(c.getTrabajoNombre());
        copia.setTrabajoPuesto(c.getTrabajoPuesto());
        copia.setTrabajoDireccion(c.getTrabajoDireccion());
        copia.setTrabajoCiudad(c.getTrabajoCiudad());
        copia.setTrabajoProvincia(c.getTrabajoProvincia());
        copia.setTrabajoCodigoPostal(c.getTrabajoCodigoPostal());
        copia.setTrabajoTelFijo(c.getTrabajoTelFijo());
        copia.setTrabajoTelFax(c.getTrabajoTelFax());
        copia.setTrabajoWeb(c.getTrabajoWeb());
        copia.setSeguimiento(c.getSeguimiento());
        this.guardar(copia);
    }
    
    private String transformarFecha(java.sql.Date sqlFecha)
    {
        java.util.Date utilFecha= new java.util.Date(sqlFecha.getTime());
        Calendar calendarFecha= Calendar.getInstance();
        calendarFecha.setTime(utilFecha);
        String ret= calendarFecha.get(Calendar.DATE) + "/" + (calendarFecha.get(Calendar.MONTH) + 1) + "/" +
                calendarFecha.get(Calendar.YEAR);
        return ret;
    }
    
    private java.sql.Date transformarFecha(String fecha)
    {
        String [] atomo= fecha.split("/");
        Calendar calendarFecha= Calendar.getInstance();
        calendarFecha.clear();
        calendarFecha.set(Integer.parseInt(atomo[2]), Integer.parseInt(atomo[1]) - 1, Integer.parseInt(atomo[0]));
        java.sql.Date sqlFecha= new java.sql.Date(calendarFecha.getTimeInMillis());
        return sqlFecha;
    }
    
    private String transformarClob(Clob clob) throws SQLException, IOException
    {
        StringBuilder ret= new StringBuilder();
        String aux;
        BufferedReader buffer= new BufferedReader(clob.getCharacterStream());
        while ((aux= buffer.readLine()) != null)
            ret.append(aux);
        return ret.toString();
    }
    
    public boolean poseeClientes(Carpeta c) throws SQLException
    {
        String renglon= "SELECT COUNT(id) FROM Cliente WHERE carpeta= " + c.obtenerId();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        r.next();
        return (r.getLong(1) > 0);
    }
}
